/**
 * 优化的登录API
 * 展示如何使用ApiHelper和依赖注入来改进API结构
 */

import { ApiCall } from "tsrpc";
import { ReqLogin, ResLogin } from "../shared/api_client/PtlLogin";
import { ApiHelper, ApiErrorCode } from "../infrastructure/api/ApiHelper";
import { createApiContext } from "../infrastructure/di/ServiceContainer";
import { ComType } from "../core/tool/component";
import { mathType } from "../core/tool/face";
import { env } from "../config";

/**
 * 优化的登录API实现
 * 使用依赖注入减少全局访问，使用ApiHelper统一错误处理
 */
export default async function OptimizedApiLogin(call: ApiCall<ReqLogin, ResLogin>) {
    // 记录API调用
    ApiHelper.logApiCall(call, 'ApiLogin');
    
    // 使用ApiHelper进行参数验证和错误处理
    await ApiHelper.withValidation(call, ['account'], async (call) => {
        const { account } = call.req;
        
        // 创建API上下文，获取依赖服务
        const context = createApiContext();
        
        // 使用依赖注入获取服务，而不是直接访问全局对象
        const userManager = context.userManager;
        const clientManager = context.clientManager;
        const commonTools = context.commonTools;
        const cardTools = context.cardTools;
        
        // 查找玩家
        let player = userManager.getOnlinePlayer(account);
        
        // 开发环境下的特殊处理
        if (!player && env.DEV) {
            player = await userManager.loadPlayerFromDB(account);
            if (!player) {
                ApiHelper.error(call, ApiErrorCode.PLAYER_NOT_FOUND, '不存在的账号,请先注册');
                return;
            }
        }
        
        // 检查玩家是否在线
        if (!ApiHelper.checkPlayerOnline(player, call, account)) {
            return;
        }
        
        // 生成授权token
        const token = commonTools.uuid;
        const tokenExpiry = Date.now() + 30 * 60 * 1000; // 30分钟
        
        // 设置等待令牌
        clientManager.waitTokenMap.set(token, { 
            id: player.id, 
            expiredTime: tokenExpiry 
        });
        
        // 创建授权对话框
        await createAuthorizationDialog(player, token, cardTools, clientManager);
        
        // 开发环境自动通过授权
        if (env.DEV) {
            clientManager.passToken(token);
        }
        
        // 返回成功响应
        ApiHelper.success(call, { token });
    });
}

/**
 * 创建授权对话框
 * 将对话框创建逻辑提取为独立函数，便于测试和维护
 */
async function createAuthorizationDialog(
    player: any, 
    token: string, 
    cardTools: any, 
    clientManager: any
): Promise<void> {
    const popComponent = player.getComponent(ComType.对话框);
    if (!popComponent) {
        throw new Error('玩家缺少对话框组件');
    }
    
    // 创建授权卡片
    const card = cardTools.create();
    card.title('登录授权');
    card.l('你的账号正在网页请求授权登录');
    
    // 配置按钮
    const buttonConfigs = [
        {
            text: '授权',
            mathType: mathType.完全匹配,
            action: () => {
                popComponent.close();
                if (player) {
                    player.client_text('授权登录成功');
                    clientManager.passToken(token);
                }
            }
        },
        {
            text: '取消',
            mathType: mathType.完全匹配,
            action: () => {
                popComponent.close();
                if (player) {
                    player.client_text('取消授权');
                    clientManager.waitTokenMap.delete(token);
                }
            }
        }
    ];
    
    // 注册按钮意图
    popComponent.registerPopupButtonIntents(buttonConfigs, player, card);
    
    // 设置对话框内容和拦截
    popComponent._content = card.getText();
    popComponent.reg(mathType.全部拦截, '', () => {
        popComponent.active();
    }, player);
    
    // 激活对话框
    popComponent.active();
}
